package com.lx.boot.web.annotation;

import com.lx.annotation.Note;
import com.lx.boot.web.filter.ApiEncryptFilter;

import java.lang.annotation.*;

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
@Note("接口权限验证, 作用于Controller的类或者方法上")
public @interface Auth {

    @Note("参数为false 不进行登录验证")
    boolean value() default true;

    @Note("参数为true时 不进行SecurityFilter验证")
    boolean exclude() default false;

    @Note("将调用者UserType与参数进行正则匹配,正确即可通过!")
    String allowUserTypeRegex() default "";

    @Note("将调用者permissions与url进行匹配,有权限即可通过!")
    boolean allowPermissions() default false;

    @Note("将调用者IP与 OS.getProperty(key) 进行正则匹配,正确即可通过!")
    String ipWhiteListRegexApplicationKey() default "";

    @Note("根据用户ID+url限制调用次数, 参数参考正则(1/5s):次数/时间 [1-9]\\d{0,5}/([M,d]|([1-9]\\d{0,3}[H,m,s]))")
    String callNumberByUser() default "";

    @Note("根据IP+url限制调用次数, 参数参考正则(1/5s):次数/时间 [1-9]\\d{0,5}/([M,d]|([1-9]\\d{0,3}[H,m,s]))")
    String callNumberByIp() default "";

    @Note("当前接口是否关闭日志")
    boolean closeLogTrace() default false;

    @Note("指定接口过滤器 例如: DefaultApiEncryptFilter SysApiEncryptFilter 也可以自定义")
    Class<? extends ApiEncryptFilter> apiFilter() default ApiEncryptFilter.class;


    @Note("是否允许跨域")
    BoolOption allowCrossdomain() default BoolOption.AUTO;

    @Note("是否进行csrf检查")
    BoolOption csrf() default BoolOption.AUTO;

    @Note("firmId是否必填")
    BoolOption firmIdRequired() default BoolOption.AUTO;

    enum BoolOption {
        AUTO,FALSE,TRUE;
        public boolean get(boolean auto){
            switch (this){
                case AUTO : return auto;
                case FALSE: return false;
                case TRUE: return true;
                default: return auto;
            }
        }
    }
}